/**
 * 类：继承和成员修饰符
 * TS 的 类 覆盖了 ES6 的类，并引入了更多特性
 */

class Dog {
  // 公有属性
  // 子类也无法访问
  private name: string

  // 只读属性，一定要被初始化
  readonly legs: number = 4

  constructor(name: string) {
    // 类成员的属性是实例属性，不是原型属性
    // 与 ES6 不同的是，属性必须有初始值
    this.name = name
  } // ts 支持为构造函数设置为 private，这样既无法被继承，也无法被实例化

  // 类成员的方法是 原型方法
  run() {

  }

  // protected 表示受保护成员，可以在类或者子类中访问
  protected pro() {

  }
}

console.log(Dog.prototype)
const dog = new Dog('Dog')
console.log(Dog.prototype)
console.log(dog)

class Husky extends Dog {
  // 静态成员，只可以通过类名调用 Husky.food
  static food: string = 'bones'

  color: string

  // 构造函数的参数可以添加修饰符，作用是将参数自动变为实例属性
  // 这样就可以省略在类中的定义了
  constructor(name: string, color: string, public weight: number) {
    // 子类构造函数，必须调用父类的构造函数
    super(name) // super 必须要放在最前面

    this.color = color
  }
}

console.log(
  Husky.food
)

